package feishu

import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"strings"
	"v2/model"
)

// FeiShuNotifier 飞书通知器
type FeiShuNotifier struct {
	WebhookURL string
}

// NewFeiShuNotifier 创建飞书通知器
func NewFeiShuNotifier(webhookURL string) *FeiShuNotifier {
	return &FeiShuNotifier{WebhookURL: webhookURL}
}

// Send 发送消息到飞书
func (f *FeiShuNotifier) Send(alert model.AlertInfo) error {
	// 检查是否有专门的卡片消息
	if cardMessage, ok := alert.TagsMap["card_message"]; ok && alert.Cate == "kube-event" {
		// 使用专门的 kube-event 卡片消息
		return f.sendCardMessage(cardMessage)
	}

	// 使用默认消息格式（保持原有逻辑）
	message := fmt.Sprintf(
		"%s\n\n**规则名称**: %s\n**集群**: %s\n**严重级别**: %s\n**触发时间**: %s\n**触发值**: %s\n**分组名称**: %s",
		alert.EmojiPrefix(),
		alert.RuleName,
		alert.Cluster,
		alert.SeverityText,
		alert.FormattedTime,
		alert.TriggerValue,
		alert.GroupName,
	)

	// 如果有标签，添加标签信息
	if len(alert.TagsMap) > 0 {
		message += "\n\n**标签**:\n"
		for k, v := range alert.TagsMap {
			// 跳过card_message标签，因为它不是普通标签
			if k != "card_message" {
				message += fmt.Sprintf("- `%s`: `%s`\n", k, v)
			}
		}
	}

	payload := map[string]interface{}{
		"msg_type": "text",
		"content": map[string]string{
			"text": message,
		},
	}

	return f.sendPayload(payload)
}

// sendCardMessage 发送卡片消息
func (f *FeiShuNotifier) sendCardMessage(cardMessage string) error {
	// 直接使用字符串格式的卡片消息
	payload := map[string]interface{}{
		"msg_type": "text",
		"content": map[string]string{
			"text": cardMessage,
		},
	}

	return f.sendPayload(payload)
}

// sendPayload 发送负载到飞书
func (f *FeiShuNotifier) sendPayload(payload map[string]interface{}) error {
	// 如果是文本消息且内容为空，添加默认内容
	if msgType, ok := payload["msg_type"].(string); ok && msgType == "text" {
		if content, ok := payload["content"].(map[string]interface{}); ok {
			if text, ok := content["text"].(string); ok && text == "" {
				content["text"] = "Kubernetes事件告警"
			}
		}
	}

	jsonData, err := json.Marshal(payload)
	if err != nil {
		return fmt.Errorf("序列化消息失败: %v", err)
	}

	log.Printf("📤 发送到飞书: %s", string(jsonData))

	resp, err := http.Post(f.WebhookURL, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		return fmt.Errorf("发送请求失败: %v", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("发送失败，状态码: %d", resp.StatusCode)
	}

	// 检查响应内容
	var result map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查飞书返回的错误码
	if code, ok := result["code"].(float64); ok && code != 0 {
		msg := "未知错误"
		if m, ok := result["msg"].(string); ok {
			msg = m
		}
		// 忽略重复消息错误
		if strings.Contains(msg, "duplicate") {
			log.Printf("⚠️ 飞书返回重复消息警告（已忽略）: %s", msg)
			return nil
		}
		return fmt.Errorf("飞书返回错误: %s", msg)
	}

	log.Printf("✅ 成功发送到飞书")
	return nil
}
